package cn.bearspark.like.provider.dao.mapper;

import cn.bearspark.framework.redis.starter.buffer.list.RedisPageListMapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Set;

/**
 * 动态点赞的数据映射接口
 *
 * @author f
 */
@Mapper
public interface HappeningLikeMapper extends RedisPageListMapper {

    /**
     * 添加一条点赞动态的记录
     *
     * @param userId      点赞的用户 id
     * @param happeningId 被点赞的动态 id
     * @return 添加操作影响的行数
     */
    @Insert("INSERT INTO t_happening_like (user_id, happening_id) VALUES (#{userId}, #{happeningId})")
    int insert(long userId, long happeningId);

    /**
     * 删除一条点赞动态的记录
     *
     * @param userId      取消点赞的用户 id
     * @param happeningId 被取消点赞的动态 id
     * @return 删除操作影响的行数
     */
    @Delete("DELETE FROM t_happening_like WHERE user_id = #{userId} AND happening_id = #{happeningId}")
    int delete(long userId, long happeningId);

    /**
     * 查询点赞指定动态的用户 id 集合，按照时间倒序排序
     *
     * @param happeningId 指定动态的 id
     * @param offset      偏移量
     * @param size        元素数
     * @return 点赞指定动态的用户 id 集合
     */
    @Override
    @Select("SELECT user_id FROM t_happening_like WHERE happening_id = #{happeningId} " +
            "ORDER BY create_time DESC LIMIT #{offset}, #{size}")
    List<Long> listPageId(long happeningId, int offset, int size);

    /**
     * 在指定动态集合中筛选指定用户点赞的动态 id 集合
     *
     * @param happeningIdList 指定动态的 id 集合
     * @param userId          指定用户的 id
     * @return 在指定动态集合中，指定用户点赞的动态 id 集合
     */
    Set<Long> getLikedHappeningIdSet(List<Long> happeningIdList, long userId);

    /**
     * 判断指定动态是否被指定用户点赞
     *
     * @param happeningId 指定动态的 id
     * @param userId      指定用户的 id
     * @return 指定动态和指定用户的点赞记录的条数，如果为 0，则表示没有点赞；否则点赞
     */
    @Select("SELECT COUNT(*) FROM t_happening_like WHERE user_id = #{userId} AND happening_id = #{happeningId}")
    int countHappeningLiked(long happeningId, long userId);
}
